﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Windows.Forms;

namespace Quanly_Tour.DAL
{
    class Quanly_DAL
    {
        private SqlConnection conn;
        private SqlDataAdapter dataAp;
        private DataTable dataTable;

        // TẠO CONSTRUCTOR GỌI KẾT NỐI KHI NEW LỚP Quanly_DAL
        public Quanly_DAL()
        {
            Connect();
        }

        // HÀM KẾT NỐI DATABASE
        public void Connect()
        {
            string strConn = @"Data Source=.\SQLEXPRESS;
                               AttachDbFilename=E:\Quanly_tour.mdf;
                               Integrated Security=True;
                               Connect Timeout=30;
                               User Instance=True";
            try
            {
                conn = new SqlConnection(strConn);
                conn.Open();
                conn.Close();
            }
            catch (Exception ex)
            {
                throw (ex);
            }
        }

        // HÀM LẤY DỮ LIỆU CÂU QUERY TRUYỀN VÀO DATATABLE
        public DataTable GetDataTable(string sql)
        {
            dataTable = new DataTable();            
            try
            {
                // Tạo dataApdapter, thực hiện câu lệnh query
                dataAp = new SqlDataAdapter(sql, conn);
                // Đổ dữ liệu vào DataTable            
                dataAp.Fill(dataTable);
            }
            catch (Exception ex)
            {
                throw(ex);
                //MessageBox.Show("Lỗi "+ ex.ToString() +"\n"+sql);
            }
            return dataTable;
        }

        // HÀM THỰC HIỆN CÂU QUERY INSERT, UPDATE, DELETE VÀ TRẢ VỀ TRUE/FALSE
        public bool ExecuteQuery(string sql)
        {
            int numRecordsEffect = 0;
            try
            {
                if (conn.State == ConnectionState.Closed)
                    conn.Open();
                SqlCommand cmd = new SqlCommand(sql, conn);
                numRecordsEffect = cmd.ExecuteNonQuery();
                if (conn.State == ConnectionState.Open)
                    conn.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi " + ex.ToString() + "\n" + sql);
                throw (ex);
            }
            if (numRecordsEffect > 0)
                return true;
            return false;
        }

        // LẤY TÊN CÁC CỘT TRONG BẢNG
        public List<string> GetColumnName(string table)
        {
            string sql = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME ='" + table + "';";
            DataTable dt = GetDataTable(sql); 
            List<string> colname = new List<string>();
            foreach (DataRow row in dt.Rows)
                colname.Add(row[0].ToString());            
            return colname;
        }

        // LẤY KHÓA CHÍNH TRONG TABLE
        public bool[] GetPK(string table)
        {
            List<string> colname = GetColumnName(table);
            string sql_pk = @"SELECT COLUMN_NAME 
                              FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
                              WHERE (OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_NAME), 'IsPrimaryKey') = 1) 
			                  AND (TABLE_NAME = '" + table + "')";
            DataTable dt = GetDataTable(sql_pk); 
            int n = dt.Rows.Count;
            int i = 0;
            string[] pk = new string[n];
            foreach (DataRow row in dt.Rows)
                pk[i++] = row[0].ToString();

            bool[] Primarykey = new bool[colname.Count];
            for(int j = 0; j < Primarykey.Count(); j++) Primarykey[j] = false;

            foreach(string col in pk)
                if(colname.IndexOf(col) >= 0) Primarykey[colname.IndexOf(col)] = true;
            return Primarykey;
        }

        // SELECT * FROM TABLE WHERE CONDITON
        public DataTable Select(string table, string condition)
        {
            string sql = "SELECT * FROM " + table;
            if (condition != null) sql += " WHERE " + condition;
            sql += ";";
            return GetDataTable(sql);
        }

        // SELECT * FORM TABLE
        public DataTable Select(string table)
        {
            return Select(table, null);
        }

        // INSERT INTO TABLE
        public bool Insert(string table, string[] val)
        {
            string sql = "INSERT INTO " + table + " VALUES(";
            for (int i = 0; i < val.Count(); i++)
            {
                sql += "N'" + val[i] + "',";
            }
            sql = sql.Substring(0, sql.Length - 1);
            sql += ");";
            return ExecuteQuery(sql);
        }

        // UPDATE
        public bool Update(string table, string[] val)
        {
            List<string> colname = GetColumnName(table);
            bool[] Pk = GetPK(table);
            string sql = "UPDATE " + table + " SET ";
            string data = "";
            string condition = "";
            for (int i = 0; i < val.Count(); i++)
            {
                if(!Pk[i]) // NẾU KHÔNG LÀ KHÓA CHÍNH THÌ ĐƯA VÀO data
                    data += colname[i] + " = N'" + val[i] + "',";
                else       // NẾU LÀ KHÓA CHÍNH THÌ ĐƯA VÀO ĐIỀU KIỆN
                    condition += colname[i] + " = N'" + val[i] + "',";
            }
            // XÓA DẤU , THỪA Ở data VÀ condition
            data = data.Substring(0, data.Length - 1);
            condition = condition.Substring(0, condition.Length - 1);

            sql += data + " WHERE " + condition + " ;";
            return ExecuteQuery(sql);
        }

        // DELETE
        public bool Delete(string table, string condition)
        {
            string sql = "DELETE FROM " + table + " WHERE " + condition + ";";
            return ExecuteQuery(sql);
        }
    }
}
